package com.hrm.system.service;

import com.hrm.common.service.BaseService;
import com.hrm.common.utils.IdWorker;
import com.hrm.common.utils.PermissionConstants;
import com.hrm.domain.system.Permission;
import com.hrm.domain.system.Role;
import com.hrm.system.dao.PermissionDao;
import com.hrm.system.dao.RoleDao;
import com.hrm.system.dao.RoleDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.io.Serializable;
import java.util.*;

/**
 * @Author: 林海湾Sea
 * @Date :  2021/11/26 16:08
 * @Decription:
 */
@Service
public class RoleService extends BaseService {

    @Autowired
    private IdWorker idWorker;

    @Autowired
    private RoleDao roleDao;

    @Autowired
    private PermissionDao permissionDao;

    /**
     * 1、添加角色
     */
    public void addRole(Role role) {

        //1、设置角色id
        String id = idWorker.nextId() + "";
        role.setId(id);
        roleDao.save(role);
    }

    /**
     * 2、更新角色信息
     */
    public void update(Role role) {

        // 1、根据角色id，查找未修改之前的角色
        Role targetRole = roleDao.getOne(role.getId());
        // 2、设置角色信息
        targetRole.setDescription(role.getDescription());
        targetRole.setName(role.getName());
        roleDao.save(targetRole);
        // 3、保存更新的员工信息
        roleDao.save(targetRole);
    }

    /**
     * 3、根据Id查询角色
     */
    public Role findById(String id) {
        Role role = roleDao.findById(id).get();
        return role;
    }

    /**
     * 4、查询全部用户列表
     *    参数：map集合形式
     *    hasDept:     是否分配部门，0：未分配，1：已分配
     *    departmentId:部门id
     *    companyId:   公司id
     */
//    public Page<Role> finaAll(Map<String, Object> map, int page, int size) {
//
//    }

    /**
     * 5、根据id删除角色
     */
    public void deleteRole(String id) {
        roleDao.deleteById(id);
    }

    /**
     * 查询所有角色：
     * 根据内部维护的公司id进行查询该公司的所有角色
     */
    public List<Role> findAll(String companyId) {
        List<Role> roleList = roleDao.findAll(getSpec(companyId));
        return roleList;
    }

    /**
     * @param companyId ：公司id
     * @param page      ：第几页
     * @param size      ：每页大小
     * @return： 角色集合
     */
    public Page<Role> findByPage(String companyId, int page, int size) {
        return roleDao.findAll(getSpec(companyId), PageRequest.of(page, size));
    }

    /**
     * 分配权限
     *
     * @param roleId：        角色ID
     * @param permIds：       权限ID列表
     */
    public void assignPerms(String roleId, List<String> permIds) {
        // 1、获取分配的角色对象
        Role role = roleDao.findById(roleId).get();
        // 2、构造角色存放权限的集合
        Set<Permission> perms = new HashSet<>();
        for (String permId : permIds) {
            Permission permission = permissionDao.findById(permId).get();
            // 遍历权限集合，根据权限id获取权限
            List<Permission> apiList = permissionDao.findByTypeAndPid(PermissionConstants.PERMISSION_API, permission.getId());
            // 自动赋予api权限
            perms.addAll(apiList);
            // 当前菜单或按钮的权限
            perms.add(permission);
        }
        // 设置角色和权限的关系
        role.setPermissions(perms);
        // 更新角色
        roleDao.save(role);
    }
}
